#ifndef DECODETHREAD_H
#define DECODETHREAD_H


#include <QThread>
#include <QMutex>
#include <QWaitCondition>
#include <QImage>
#include "VideoDecoder.h"
#include "AudioDecoder.h"
#include "AudioOutput.h"


struct SwsContext;



class DecodeThread : public QThread
{
    Q_OBJECT

public:
    explicit DecodeThread(QObject* parent = nullptr);
    ~DecodeThread();


    bool openVideo(const QString& videoPath);


    void closeVideo();


    void play();


    void pause();


    void stop();


    void seek(int64_t positionMs);

    int64_t getDurationMs() const;
    
    // 音量控制（0-100）
    void setVolume(int volume);
    
    // 倍速控制（0.5 = 0.5x, 1.0 = 1.0x, 2.0 = 2.0x）
    void setPlaybackSpeed(double speed);

    // 获取解码器（用于访问硬件解码信息）
    VideoDecoder* getDecoder() const { return m_decoder; }

signals:
    void frameDecoded(QImage image,int64_t ptsMs);

    void durationChanged(int64_t durationMs);


    void positionChanged(int64_t positionMs);

    void playbackFinished();


    void errorOccurred(const QString& error);


protected:
    void run() override;

private:
    bool initSwsContext(int width, int height, int pixelFormat);

    void freeSwsContext();

    QImage convertToQImage(const VideoFrame& frame);


    VideoDecoder* m_decoder;
    SwsContext* m_swsCtx;
    int m_currentPixelFormat;  // 当前 swsContext 的像素格式
    
    // 音频相关
    AudioDecoder* m_audioDecoder;
    AudioOutput* m_audioOutput;
    bool m_hasAudio;  // 标记是否有音频流

    bool m_isPlaying;
    bool m_stopRequested;
    bool m_seekRequested;

    int64_t m_seekPositionMs;

    //线程同步

    QMutex m_mutex;

    QWaitCondition m_condition;

    //视频信息

    int m_frameDelay;
    
    // 倍速播放
    double m_playbackSpeed;  // 播放速度倍数（1.0 = 正常速度）
};

#endif